package com.codemonkey.lq.common.bean;

import com.codemonkey.lq.common.util.StringHelper;

/**
 * 存放验证性信息,  还得提供一个异常和有好信息一起的类级别的封装, 传入异常时比如传入相应的友好性提示信息
 * Validate Result
 * @author LQ
 *
 */
final class ValidateRV {
	private final boolean isSuccess;
	private final String errorMsg;
	private final Object data;

	public Object getData() {
		return data;
	}

	private ValidateRV(boolean isSuccess, String errorMsg, Object data) {
		super();
		this.isSuccess = isSuccess;
		this.errorMsg = errorMsg;
		this.data = data;
	}

	/**
	 * @param data 将要返回的相关数据
	 * @return
	 */
	public static ValidateRV of(Object data) {
		return of(true, null, data);
	}

	/**
	 * @param errorMsg 返回的错误信息.因为of(Object data)的存在,所以向of传递null参数时,会调用这个方法.而我们的本意应该是上面那个of(Object data).
	 * 	可以考虑强制转型来调用
	 * @return
	 */
	public static ValidateRV of(String errorMsg) {
		//如果调用者传递null时,会走这个方法.而不是上面那个Object类型的参数.
		if (StringHelper.isEmpty(errorMsg)) {
			return of((Object) errorMsg);
		}
		return of(false, errorMsg, null);
	}

	private static final ValidateRV ONLY_SUCCESS_FLAG_RV = of(true, null, null);

	/**
	 * @return 代表本次所有操作全部正确完成.
	 */
	public static ValidateRV ofOnlySuccess() {
		return ONLY_SUCCESS_FLAG_RV;
	}

	public static ValidateRV of(boolean isSuccess, String errorMsg, Object data) {
		return new ValidateRV(isSuccess, errorMsg, data);
	}

	public boolean isSuccess() {
		return isSuccess;
	}

//	@Override
//	public String toString() {
//		return toJSONString();
//	}

//	/**
//	 * @return status : 0表示成功;1表示失败
//	 *         msg    : 失败时的错误信息
//	 *         data   : 成功时返回的数据
//	 */
//	public String toJSONString() {
//		JSONObject object = new JSONObject();
//		object.put("status", isSuccess ? 0 : 1);
//		object.put("msg", errorMsg);
//		object.put("data", data);
//		return object.toJSONString();
//	}

	/**
	 * 构建者模式
	 
	public static class Builder {
	private boolean status = true;
	private String msg = StringUtils.EMPTY;
	private Object data = null;

	public Builder status(boolean status) {
	    this.status = status;
	    return this;
	}

	public Builder msg(String msg) {
	    this.msg = msg;
	    return this;
	}

	public Builder data(Object data) {
	    this.data = data;
	    return this;
	}

	public ReturnValue builder() {
	    return new ReturnValue(this.status, this.msg, this.data);
	}
	}
	
	 public static void main(String[] args) {
	String string = new ReturnValue.Builder().status(false).msg("haha").data("this").builder().toString();
	System.out.println(string);
	}   
	*/
}